package com.sxbbc.common.core.utils;

import java.util.ArrayList;
import java.util.Collections;

/**
 * 笛卡尔积 计算工具类
 *
 * @author leehao
 * @date 2019-05-27 19:08
 */
public class DescartesUtil {

    /**
     * 计算 多个集合的笛卡尔积
     *
     * @param dimValues 存储多个集合的 二维list
     * @return
     */
    public static ArrayList<String> descartes(ArrayList<ArrayList<String>> dimValues) {
        //list反转，以第一个规格进行计算，与页面一致
        Collections.reverse(dimValues);
        //用于自我复制
        ArrayList<String> result = new ArrayList<String>();
        for (int i = 0; i < dimValues.size(); i++) {
            ArrayList<String> curList = dimValues.get(i);
            //如果是首个集合，直接放输入到结果集中
            if (0 == i) {
                for (String tempStr : curList) {
                    result.add(tempStr);
                }
                continue;
            }
            //将前一个集合的乘积 result，自我复制 curListCount 份，并将当前集合的元素追加到上边
            selfCopy(result, curList);
        }
        return result;
    }

    /**
     * 根据当前的集合，将之前的结果集复制
     *
     * @param result  　　之前的集合相称的结果集
     * @param curList 　　当前集合
     */
    private static void selfCopy(ArrayList<String> result, ArrayList<String> curList) {
        ArrayList<String> tempList = new ArrayList<String>();
        for (String strOfCurList : curList) {
            for (String strOfResult : result) {
                //因为这里是字符串集合相称，那么其实就是字符串相加。
                //加,是因为适合存数据库的格式
                tempList.add(strOfCurList+"," + strOfResult);
            }
        }
        result.clear();
        for (String tempStr : tempList) {
            result.add(tempStr);
        }
    }

    /*public static void main(String[] args) {

        ArrayList<String> a = new ArrayList<String>();
        a.add("白色");
        a.add("黄色");
        a.add("蓝色");
        ArrayList<String> b = new ArrayList<String>();
        b.add("170");
        b.add("175");
        b.add("180");
        ArrayList<String> c = new ArrayList<String>();
        c.add("尼龙");
        c.add("纤维");
        ArrayList<String> d = new ArrayList<String>();
        d.add("福建");
        d.add("浙江");
        d.add("广东");

        ArrayList<ArrayList<String>> dimValue = new ArrayList<ArrayList<String>>();
        dimValue.add(a);
        dimValue.add(b);
        //dimValue.add(c);
        //dimValue.add(d);

        System.out.println(dimValue);

        ArrayList<String> result = descartes(dimValue);
        for (String temp : result) {
            System.out.println(temp);
        }
    }*/
}
